
//判断整数是否为0
bool isZero(int number){
  return number == 0;
}
//表达式只有一行时，可简写
//bool isZero(int number) => number == 0;

//用check函数来判断整数是否为0
void printInfo(int number, Function check){
  print("$number is  Zero：${check(number)}");
}
//表达式只有一行时，可简写
//void printInfo(int number, Function check) => print("$number is  Zero：${check(number)}");


//要达到可选命名参数的用法，那就在定义函数的时候给参数加上 {}
void enable1Flags({bool bold,bool hidden}) => print("$bold ， $hidden");

//定义可选命名参数时增加默认值
void enable2Flags({bool bold = true ,bool hidden = false}) => print("$bold ， $hidden");

//可忽略的参数在函数定义时用[]符号指定
void enable3Flags(bool bold , [bool hidden]) => print("$bold ， $hidden");

//定义可忽略参数时增加默认值
void enable4Flags(bool bold , [bool hidden = false]) => print("$bold ， $hidden");


class Point{
  num x , y;
  static num factor = 0;
  //类同于函数体内的  this.x = x   this.y = y
  Point(this.x,this.y);
  void printInfo() => print("($x, $y)");
  static void printZValue() => print("$factor");
}

class PointZ{
  num x, y, z;
  //初始化变量z
  //:用于构造函数初始化其内部属性或做一些前置检查；
  PointZ(this.x, this.y) : z = 0;
  //重定向构造函数
  PointZ.bottom(num x) : this(x, 0);
  //=>是用于普通单行函数的语法糖
  void printInfo() => print("($x, $y, $z)");
}

class PointX{
  num x = 0, y = 0;
  void printInfo() => print("($x, $y)");
}

class Vecotr extends PointX{

  num z = 0;

  @override
  void printInfo() {
    print("($x, $y, $z)");
  }
}

class Coordinate implements PointX{

  //成员变量需要重新声明
  num x,y,z = 10;

  @override
  void printInfo() {
    //成员方法也需要重新实现
    print("($x, $y, $z)");
  }
}

//注意with语句必须写在implements的前面，extends的后面
class CoordinateWith with PointX{

}



class Vectors {
  num x, y;
  Vectors(this.x, this.y);
  // 自定义相加运算符，实现向量相加
  //operator 是 Dart 的关键字，与运算符一起使用，表示一个类成员运算符函数
  Vectors operator +(Vectors v) =>  Vectors(x + v.x, y + v.y);
  // 覆写相等运算符，判断向量相等
  //operator==是继承自Object类，这个类的参数声明就是dynamic
  bool operator == (dynamic v) => x == v.x && y == v.y;
}




void main(){

  //函数初体验以及函数作为参数传递
  Function f = isZero;
  int x = 10;
  int y = 0;
  printInfo(x,f);
  printInfo(y,f);

  //可选命名参数函数调用
  enable1Flags(bold: true, hidden: false);
  enable1Flags(bold: true);
  enable1Flags();
  enable2Flags(bold: false, hidden: false);
  enable2Flags();

  //可忽略参数函数调用
  enable3Flags(false);
  enable3Flags(false,false);
  enable4Flags(true);
  enable4Flags(true,true);

  //类的定义及初始化
  var p = new Point(10, 20);
  print("Point -> x：${p.x}");
  p.printInfo();
  Point.factor = 100;
  Point.printZValue();

  var pp = PointZ.bottom(100);
  pp.printInfo();

  //继承与实现
  var xxx = Vecotr();
  //联级运算符
  xxx
      ..x = 1
      ..y = 2
      ..z = 3;
  xxx.printInfo();

  var yyy = Coordinate();
  yyy
      ..x = 10
      ..y = 20
      ..z = 30;
  yyy.printInfo();
  print(yyy is Coordinate);
  print(yyy is PointX);

  //另一种机制来实现类的复用，即“混入”
  var zzz = CoordinateWith();
  zzz.printInfo();


  // ?. 运算符  p为null 时跳过，避免抛出异常
  p ?.printInfo();

  // ??= 默认值兜底的赋值语句
  var aa;
  print(aa ??= 100);

  // ?? 3元运算符
  var bb = 1;
  print( (aa != null) ? aa : bb);
  //类同于
  print( aa ?? bb );


  //操作符也是对象
  final x_x = Vectors(3, 3);
  final y_y = Vectors(2, 2);
  final z_z = Vectors(1, 1);
  print(x_x == (y_y + z_z)); //  输出true

}

